#include "LogPlugin.h"
#include <QDebug>
#include <QCoreApplication>
#include "LogWidget.h" // 引入LogLevel枚举

// 定义插件名称常量
#define LOG_PLUGIN_NAME "LogPlugin"

/**
 * @brief 构造函数，初始化日志插件
 * @param parent 父对象指针（用于内存管理）
 */
LogPlugin::LogPlugin(QObject *parent)
    : CameraPluginInterface(parent)
{
}

/**
 * @brief 初始化日志插件
 * 负责创建LogWidget实例、设置日志目录并将日志界面注册到主框架
 */
void LogPlugin::initialize(){
    // 初始化日志插件
    logWidget = new LogWidget();
    
    // 设置日志文件存储目录为应用程序所在目录下的Logs文件夹
    QString logDir = QCoreApplication::applicationDirPath() + "/Logs";
    logWidget->setLogDir(logDir);
    
    // 将日志界面注册到主框架的软件运行提示停靠窗口
    emit registerWidgetToDock(DockWidgetType::SoftwareLog, logWidget);
}

/**
 * @brief 析构函数，释放日志插件资源
 * 负责清理LogWidget实例
 */
LogPlugin::~LogPlugin()
{
    if (logWidget)
    {
        delete logWidget;
        logWidget = nullptr;
    }
}

/**
 * @brief 获取插件名称
 * @return 插件名称字符串
 */
QString LogPlugin::pluginName() const
{
    return LOG_PLUGIN_NAME;
}

/**
 * @brief 获取插件描述
 * @return 插件描述字符串
 */
QString LogPlugin::description() const
{
    return "日志管理插件，用于记录系统运行日志及跨插件消息";
}

/**
 * @brief 处理日志指令消息
 * @param sender 发送消息的插件名称
 * @param message 日志消息内容（不包含CMD_LOG前缀）
 */
void LogPlugin::processLogMessage(const QString& sender, const QString& message) {
    LogType logType = LogType::LOG_INFO;
    QString logContent;
    bool writeToFile = false; // 默认不写入文件
    
    // 解析日志参数
    QStringList logParts = message.split(":", Qt::SkipEmptyParts);
    
    if (logParts.size() >= 1)
    {
        QString param1 = logParts[0].toUpper();
        
        // 检查第一个参数是否为日志类型
        if (param1 == "ERROR" || param1 == "错误" || 
            param1 == "WARNING" || param1 == "警告" || 
            param1 == "INFO" || param1 == "信息")
        {
            
            // 设置日志类型
            logType = (param1.contains("ERROR") || param1.contains("错误")) ? LogType::LOG_ERROR :
                      (param1.contains("WARNING") || param1.contains("警告")) ? LogType::LOG_WARNING : LogType::LOG_INFO;
            
            // 检查是否有writeToFile参数
            if (logParts.size() >= 2)
            {
                QString writeToFileStr = logParts[1].toLower();
                writeToFile = (writeToFileStr == "true" || writeToFileStr == "是");
                
                // 提取内容
                logContent = message.section(':', 2);
            }
            else
            {
                // 没有writeToFile参数，内容从第2部分开始
                logContent = message.section(':', 1);
            }
        }
        else
        {
            // 第一个参数不是日志类型，检查是否为writeToFile参数
            writeToFile = (param1.toLower() == "true" || param1.toLower() == "是");
            logContent = writeToFile ? message.section(':', 1) : message;
        }
    }
    else
    {
        // 没有额外参数，内容即为全部
        logContent = message;
    }
    
    logWidget->appendLog(sender, logContent, logType, writeToFile);
}

/**
 * @brief 处理来自其他插件的消息
 * @param sender 发送消息的插件名称
 * @param message 消息内容
 * 支持LOG指令格式："LOG:<type>:<writeToFile>:<content>"，其中type可选为INFO/WARNING/ERROR，writeToFile可选为true/false
 */
void LogPlugin::onPluginMessage(const QString& sender, const QString& message) {    qDebug() << "[LogPlugin Received Message] From:" << sender << "Message:" << message;
    
    // 验证参数有效性
    if (sender.isEmpty() || message.isEmpty()) {
        qWarning() << "[LogPlugin] Invalid message parameters: sender or message is empty";
        return;
    }
    
    // 检查是否为日志指令
    if (message.startsWith(CMD_LOG":")) {
        // 跳过CMD_LOG部分，获取剩余内容并传递给processLogMessage处理
        QString remainingMessage = message.section(':', 1);
        processLogMessage(sender, remainingMessage);
        return;
    }
    
    // 检查是否为其他指令
    if (message.startsWith("CMD_")) {
        // 记录指令消息，但不作为普通日志显示
        qDebug() << "[LogPlugin] Command received: " << message;
        
        // 可以在这里添加处理特定指令的逻辑
        // 例如，根据不同的指令类型执行相应操作
        
        // 指令通常不需要作为普通日志写入日志文件，只在调试输出中显示
        return;
    }
    logWidget->appendLog(sender, message, LogType::LOG_INFO, false);
}



/**
 * @brief 记录日志消息
 * @param sender 发送者名称
 * @param message 日志内容
 * @param logType 日志级别
 * @param writeToFile 是否写入文件
 */
void LogPlugin::logMessage(const QString &sender, const QString &message, LogType logType, bool writeToFile)
{
    logWidget->appendLog(sender, message, logType, writeToFile);
}
